Vorhersage (Klassifikation) betrügerischer Kontotransationen

Solution Engineering in R

Daniel Borsos, Valerie Högerle, Michaela Hubweber, Florian Ye

2024-05-20

Recap: Milestone 1

Ziel (Zusammenfassung)

  • Betrügerische von legitimen Transaktionen unterscheiden / Muster oder Anomalien erkennen
  • Modell für u.a. Vorhersage in shiny-Anwendung umsetzen

Daten

  • klar unbalancierte Zielvariable “isFraud”: 99,87% ist kein Betrug
  • sonstige Varibalen meist ohne Korrelation, z.B. Start-/Zielkonto, Betrag und Art der Transaktion
  • Einzig Start- und Endguthaben der jeweiligen Konten korrelieren miteinander, auch aufgrund vieler Nullwerte

Milestone 2: Explorative Datenanalyse

Erste Einblicke in die Daten

  step     type   amount    nameOrig oldbalanceOrg newbalanceOrig    nameDest
1    1  PAYMENT  9839.64 C1231006815        170136      160296.36 M1979787155
2    1  PAYMENT  1864.28 C1666544295         21249       19384.72 M2044282225
3    1 TRANSFER   181.00 C1305486145           181           0.00  C553264065
4    1 CASH_OUT   181.00  C840083671           181           0.00   C38997010
5    1  PAYMENT 11668.14 C2048537720         41554       29885.86 M1230701703
6    1  PAYMENT  7817.71   C90045638         53860       46042.29  M573487274
  oldbalanceDest newbalanceDest isFraud isFlaggedFraud
1              0              0       0              0
2              0              0       0              0
3              0              0       1              0
4          21182              0       1              0
5              0              0       0              0
6              0              0       0              0

Datenstruktur

Im Verlauf der EDA lässt sich erkennen, dass beim Fraud die Veränderung der Kontostände eine wichtige Rolle spielen. Daher werden die Variablen “change.balanceOrg”, “increase.balanceDest” und “flagFraud” erstellt.

  • “change.balanceOrg”: Differenz zwischen dem alten und neuen Kontostand des Absenders
  • “increase.balanceDest”: Differenz zwischen dem neuen und alten Kontostand des Empfängers
  • “flagFraud”: Wenn der Empfänger einen Kontostand von 0 hat und der Absender den gesamten Betrag überweist, wird die Variable auf 1 gesetzt.
'data.frame':   6362620 obs. of  14 variables:
 $ step                : int  1 1 1 1 1 1 1 1 1 1 ...
 $ type                : Factor w/ 5 levels "CASH_IN","CASH_OUT",..: 4 4 5 2 4 4 4 4 4 3 ...
 $ amount              : num  9840 1864 181 181 11668 ...
 $ nameOrig            : chr  "C1231006815" "C1666544295" "C1305486145" "C840083671" ...
 $ oldbalanceOrg       : num  170136 21249 181 181 41554 ...
 $ newbalanceOrig      : num  160296 19385 0 0 29886 ...
 $ nameDest            : chr  "M1979787155" "M2044282225" "C553264065" "C38997010" ...
 $ oldbalanceDest      : num  0 0 0 21182 0 ...
 $ newbalanceDest      : num  0 0 0 0 0 ...
 $ isFraud             : Factor w/ 2 levels "No","Yes": 1 1 2 2 1 1 1 1 1 1 ...
 $ isFlaggedFraud      : Factor w/ 2 levels "No","Yes": 1 1 1 1 1 1 1 1 1 1 ...
 $ change.balanceOrg   : num  9840 1864 181 181 11668 ...
 $ increase.balanceDest: num  0 0 0 -21182 0 ...
 $ flagFraud           : Factor w/ 2 levels "No","Yes": 1 1 2 2 1 1 1 1 1 1 ...

Fehlende Werte

[1] "Anzahl fehlender Werte: 0"

Aufverteilung der abhängigen Variable

[1] "isFraud Verteilung in Prozent"

   No   Yes 
99.87  0.13 
[1] "isFlaggedFraud Verteilung in absoluten Zahlen"

     No     Yes 
6362604      16 
[1] "Selbst erstellte Variable flagFraud Verteilung in Prozent"

   No   Yes 
99.87  0.13 

Bei isFlaggedFraud ist die Anzahl der betrügerischen Transaktionen mit 16 (von > 6 Mio) sehr gering und wird daher aus dem Datensatz entfernt. Bei dem neu erstellten flagFraud ist zu sehen, dass sie eine ähnliche Verteilung wie isFraud aufweist.

Univariate Analyse

Numerische Variablen:

Für die rechtsschiefen Variablen wird eine Log-Transformation durchgeführt, um die Verteilung zu normalisieren.

Steps

  • 1 Step entspricht einer Stunde (30 Tage Simulation)
  • ungleichmäßige Simulation ohne erkennbares Muster (z.B. Wochenenden)
  • nur 2 Steps ohne Fraud, sonst durchschnittlich 11 Betrugsfälle pro Stunde (max. 40)

amount

  • Die Beträge der Transaktionen liegen v.a. zwischen 1000,00 und 1.000.000,00 (Währung nicht angegeben)
  • der Median liegt bei 74.872,00, Ausreißer gehen bis 92 Mio.

Balance

Es liegen sehr viele Nullwerte vor:

  • 33% bei den Absendern vor der Transaktion, 57% nach der Transaktion
  • 42% der Empfänger vor der Transaktion, 38% nach der Transaktion

Kontostände außerhalb der Nullwerte:

  • die Absender hatten (wenn nicht 0) meist zwischen 1000,00 bis 10.000,00 auf dem Konto, häufige Werte gehen bis 10 Mio.
  • die Empfänger hatten (wenn nicht 0) meist zwischen 100.000 und 10 Mio (vor der Transaktion) auf dem Konto

Kategoriale Variablen:

Der Anteil an isFraud und FlagFraud liegt je bei 0,13%.

Die Transaktionen Auszahlung und Bezahlung haben einen Anteil von ca. je ein Drittel, Einzahlung ist mit 22% ebenfalls oft. Überweisungen nehmen gut 8% ein, Debit weniger als 1%.

Bivariate Analyse

Korrelationsmatrix:

Eine hohe Korrelation liegt als je zwischen altem und neuen Kontostand vor (sowohl beim Sender als auch beim Empfänger). Ein gewisser positiver Zusammenhang könnte zwischen dem Betrag und dem Empfängerkonto liegen. Der negative Zusammenhang zwischen change.balanceOrg und dem neuen Kontostand des Senders ist nachvollziehbar (je mehr Geld vom Konto weggeht, desto kleiner ist der Kontostand dort anschließend.)

Density Plots im Vergleich nach Fraud-Status:

  • Betrügerische Transaktionen haben tendenziell höhere Beträge.
  • oldbalanceOrg liegt bei notFraud bei einem Großteil bei 0. Bei Fraud ist dies nicht der Fall
  • change.balanceOrg: der abgegangene Betrag ist bei Fraud klar höher.

Barplot nach Typ und Fraud-Status:

Zu erkennen: Es sind nur betrügerische Transaktionen bei den Typen “CASH_OUT” und “TRANSFER” vorhanden. Diese werden näher betrachtet.

CASH_OUT Transaktionen:

  • oldbalanceOrig: bei notFraud liegt der Betrag größtenteils bei 0, bei Fraud ist der Kontostand so ziemlich nie bei 0. Im Durchschnitt auch eindeutig höher.
  • newbalanceOrig: bei Fraud liegt der Betrag dann größtenteils bei 0 (Konto geplündert).
  • change.balanceOrg: nochmal zu sehen, dass der abgegangene Betrag bei Fraud klar höher ist.

TRANSFER Transaktionen

  • oldbalanceOrig: bei notFraud liegt der Betrag größtenteils bei 0, bei Fraud ist der Kontostand so ziemlich nie bei 0. Im Durchschnitt auch eindeutig höher.
  • oldbalanceDest & newbalanceDest: das Seltsame ist, dass Fraud ziemlich genau bei 0, aber newbalanceDest ebenfalls bei 0 liegt.
  • change.balanceOrg: nochmal zu sehen, dass der abgegangene Betrag bei Fraud klar höher ist.

Confusion Matrix für flagFraud:

Überprüfung der Konten

Überprüfen, ob das Konto, von dem die Transaktion ausgeht, mehrere betrügerische Transaktionen durchführt.

  nameOrig_count Frequency
1              1      8213

Die allermeisten Absender (99,7%) kommen ein einziges Mal vor, der Rest taucht maximal 3x als Absender auf.

Überprüfen, ob das Konto, auf das die Transaktion erfolgt, mehrere betrügerische Transaktionen erhält.

  nameDest_count Frequency
1              1      8125
2              2        44

Pro Zielkonto gibt es also maximal 2 Betrugsfälle. Auffallend ist in dem Datensatz jedoch, dass Zielkonten wesentlich häufiger vorkommen: 35% sind nur einmalig Ziel von Transaktionen, einzelne Konten tauchen über 100x als Ziel auf. Dennoch wird kein “klassisches Betrugskonto” gefunden.

Überprüfen, wie viele Konten, von dem die Transaktion ausgehen, auch Transaktionen ohne Betrug durchführt haben.

  Fraud_nameOrg_in_nonFraud Frequency
1                         0      8185
2                         1        28

Die allermeisten Konten sind also ausschließlich betrügerisch, jedoch mit vereinzelten Ausnahmen.

Überprüfen, ob Transaktionen zwischen denselben Konten existieren.

  Count
1     0

Es gibt keine Transaktion zwischen dem selben Konto.